import CryptoJS from 'crypto-js'; // 导入 CryptoJS 库用于加密

let key = ''; // 初始为空，后续会动态更新
const acctID = '671ae6bf64998e'; // 账户ID
const url = 'openapi.keyboardadmin.com:8888'; // API URL

// 生成随机字符串
function generateRandomString(n = 6) {
	const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; // 可用字符集合
	let randomString = '';
	// 生成 n 位随机字符串
	for (let i = 0; i < n; i++) {
		randomString += characters.charAt(Math.floor(Math.random() * characters.length));
	}
	return randomString; // 返回生成的随机字符串
}

// AES-CBC 加密
function aesCbcEncrypt(data) {
	const iv = CryptoJS.lib.WordArray.random(16); // 生成随机的初始化向量
	console.log("key", key);
	const ciphertext = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), { // 使用 AES 加密数据
		iv // 设置初始化向量
	}).toString();
	return {
		encryptedText: ciphertext, // 返回加密后的文本
		iv: iv.toString(CryptoJS.enc.Base64) // 返回 IV 的 Base64 编码
	};
}

// 登录请求
async function login(username, password, sqlNumber) {
	// 构建待加密的数据字符串
	const dataString = `${acctID}|${url}|${username}|${password}`;
	const extra = generateRandomString(6); // 生成随机字符串作为额外信息
	const start = Math.floor(Math.random() * 10); // 随机选择插入位置
	const plainText = dataString + extra; // 合并待加密的字符串
	// 执行 AES 加密
	const {
		encryptedText,
		iv
	} = aesCbcEncrypt(plainText);
	// 构建最终的加密结果
	const encryptedResult = `${encryptedText.slice(0, start)}${iv}${extra}${encryptedText.slice(start)}${start}`;

	// 打印加密结果
	console.log("加密结果:", encryptedResult);
	// 发起登录请求
	try {
		const response = await uni.request({
			url: 'http://openapi.keyboardadmin.com:19898/kingapp_login', // 登录接口 URL
			method: 'POST', // 请求方法
			data: {
				sqlNumber: sqlNumber, // 固定的 SQL 编号  （授权码）
				authorization: encryptedResult, // 加密后的授权信息
			},
		});
		return response; // 返回请求结果
	} catch (error) {
		// 捕获请求错误并抛出异常
		throw new Error('请求失败：' + error.message);
	}
}

// GET 请求以获取授权码
async function getAuthorizationCode(sn) {
	try {
		const response = await uni.request({
			url: `http://openapi.keyboardadmin.com:19898/get_public/${sn}`, // GET 请求的 URL
			method: 'GET', // 请求方法
		});
		if (response.statusCode === 200 && response.data.code === 200) {
			// 提取授权码
			key = response.data.data['授权码']; // 更新密钥
			console.log('获取授权码成功:', key); // 打印授权码
			return key; // 返回授权码
		} else if (response.data.code === 400) {
			key = response.data.data['授权码'];
			console.log("成功赋值", key);
		} else {
			throw new Error('获取授权码失败');
		}
	} catch (error) {
		throw new Error('请求失败：' + error.message);
	}
}

export {
	login,
	getAuthorizationCode // 导出 getAuthorizationCode 方法
};